﻿#include<iostream>
#include<string>
#include<vector>
#include<list>
using namespace std;


// char ascll编码-》英文
// 如何显示中文？其他国家的文字计算机如何存储？unicode utf-8 utf-16 utf-32 gbk

//int main()
//{
//	char ch1 = 'a';
//	char ch2 = 97;
//	cout << ch1 << endl;
//	cout << ch2 << endl;
//
//	char str1[] = "中国";  //一个中文字符对应两个字节
//	cout << strlen(str1) << endl;
//
//	str1[3] = -7;
//	cout << str1 << endl;
//
//	str1[3] = -8;
//	cout << str1 << endl;
//
//	str1[3] = -5;
//	cout << str1 << endl;
//
//	wchar_t wch; //宽字节
//	char ch;
//
//	cout << sizeof(wch) << endl;
//	cout << sizeof(ch) << endl;
//	return 0;
//}

//int main()
//{
//	string s1;
//	string s2("hello");
//	string s3(s2);
//	string s4 = "bit te";
//	cout << s1 << endl;
//	cout << s2 << endl;
//	cout << s3 << endl;
//	cout << s4 << endl;
//
//	string s5(s4, 3, string::npos); //复制字符串s4从下标为3的位置开始，到最大值
//	cout << s5 << endl;
//
//	const char* url = "http://www.com";
//	string s6 (url, 4);//从url4复制前4个字符
//	cout << s6 << endl;
//
//	string s7(10, 'x'); //给s7追加10个字符X
//	cout << s7 << endl;
//
//	s7 = s2;
//	cout << s7 << endl;
//	return 0;
//}

//int main()
//{
//	string s1;
//	string s2("hello bit");

	//三种遍历
	// 1、下标+[]
	//for (size_t i = 0; i < s2.size(); i++)
	//{
	//	s2[i] = 'x';
	//}
	//cout << endl;
	//for (size_t i = 0; i<s2.size(); i++)
	//{
	//	cout << s2[i] << " ";
	//}
	//cout << endl;

	// 2.迭代器
	// [begin(),end()) ,end()返回的不是最后一个数据位置的迭代器，返回的是最后一个位置的下一个位置
	//也要注意的是：c++中凡是给迭代器一般都是给的[)左闭右开的区间
	//迭代器是类似指针一样的东西

//	string::iterator it = s2.begin();
//	while (it != s2.end())
//	{
//		cout << *it << " ";
//		it++;
//	}
//	cout << endl;
//
//	list<int> lt = { 1,2,3,4 };
//	list<int>::iterator ltit = lt.begin();
//	while (ltit != lt.end())
//	{
//		cout << *ltit << " ";
//		++ltit;
//	}
//	cout << endl;
//
//	string::reverse_iterator rit = s2.rbegin();
//	while (rit != s2.rend())
//	{
//		cout << *rit << " ";
//		rit++;
//	}
//	cout << endl;
//
//	//3.c++11 提供范围for，特点：写起来简洁
//	//依次取容器中的数据，赋值给e,自动判断结束
//	//for (auto& e:s2)
//	for (char& e : s2)
//	{
//		e += 1;
//	}
//	cout << endl;
//	for (auto e : s2)
//	{
//		cout << e << " ";
//	}
//	cout << endl;
//
//	for (auto e : lt)
//	{
//		cout << e << " ";
//	}
//	cout << endl;
//
//	return 0;
//}


int main()
{
	string s1;
	s1.push_back('h');
	s1.push_back('e');
	s1.push_back('l');
	s1.push_back('l');
	s1.push_back('o');
	//cout << s1 << endl;
	//s1.append("hello");
	//cout << s1 << endl;

	//string s2("!!!!");
	//s1.append(s2.begin(), s2.end());
	//cout << s1 << endl;

	////实际中最喜欢用这个+=
	//s1 += ' ';
	//s1 += "完美世界";
	//s1 += s2;
	//cout << s1 << endl;
	//return 0;

	//尽量少用insert,因为地层实现是数组，头部或中间插入需要挪动数据
	s1.insert(0, "x");//在字符串s1的头部插入x
	cout << s1 << endl;
	s1.insert(0, "x222");
	cout << s1 << endl;
	s1.insert(2, "yyyy");

	cout << s1 << endl;
	//销毁
	s1.erase(0, 1);//销毁-》0下标开始，销毁一个数据
	cout << s1 << endl;

	s1.erase(0, 5);
	cout << s1 << endl;

	s1.erase(3);   //下标3位置及以后的数据全部销毁
	cout << s1 << endl;

	s1.erase();   //数据全部销毁
	cout << s1 << endl;

	return 0;
}